/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utilities;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.rms.InvalidRecordIDException;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotFoundException;
import javax.microedition.rms.RecordStoreNotOpenException;

/**
 *
 * @author gustavo
 */
public class RecordUtility {

    private RecordStore rs;
    
    //abre arquivo
    public void open(String nome) {
        try {
            setRs(RecordStore.openRecordStore(nome, true));
        } catch (RecordStoreNotFoundException e) {
            System.out.println("-- RecordStore inexistente");
        } catch (RecordStoreException e) {
            System.out.println("-- Outro erro");
        }
    }
    
    //fecha arquivo
    public void close() {
        try {
            getRs().closeRecordStore();
        } catch (RecordStoreNotOpenException e) {
            System.out.println("-- O Record Store esta fechado");
        } catch (RecordStoreException e) {
            System.out.println("-- Outro erro");
        }
    }
    
    //adiciona um registro
    public int add(String dado[]) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            for (int i = 0; i < dado.length; i++) {
                dos.writeUTF(dado[i]);
                dos.flush();
            }
            byte[] data = baos.toByteArray();
            int id = getRs().addRecord(data, 0, data.length);
            baos.close();
            dos.close();
            return id;
        } catch (IOException e) {
            System.out.println("-- Erro de IO");
        } catch (RecordStoreFullException e) {
            System.out.println("-- Não existe espaço disponível");
        } catch (RecordStoreNotOpenException e) {
            System.out.println("-- O Record Store esta fechado");
        } catch (RecordStoreException e) {
            System.out.println("-- Outro erro");
        }
        return 0;
    }
    
    //recupera o proximo id
    public int getNextRecordId() {
        int toReturn = 0;
        try {
            toReturn = getRs().getNextRecordID();
        } catch (RecordStoreFullException e) {
            System.out.println("-- Não existe espaço disponível");
        } catch (RecordStoreNotOpenException e) {
            System.out.println("-- O Record Store esta fechado");
        } catch (RecordStoreException e) {
            System.out.println("-- Outro erro");
        }
        return toReturn;
    }

    //mexer
    //como vou fazer pra pegar posição a posição do array?
    //retorna o registro pelo id
    public String[] getRecord(int id, int tamanho) {
        String toReturn[] = new String[tamanho];
        try {
            int recordSize = getRs().getRecordSize(id);
            byte[] data = new byte[recordSize];
            ByteArrayInputStream bais = new ByteArrayInputStream(data);
            DataInputStream dis = new DataInputStream(bais);
            for(int i=0;i<toReturn.length;i++){
                int numBytes = getRs().getRecord(id, data, 0);
                //System.out.println("numero de bytes do registro: " + numBytes);
                toReturn[i] = dis.readUTF();
            }
            bais.reset();
            bais.close();
            dis.close();
        } catch (IOException e) {
            System.out.println("-- Erro de IO");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("-- Registro muito grande");
        } catch (InvalidRecordIDException e) {
            System.out.println("-- ID inexistente");
        } catch (RecordStoreNotOpenException e) {
            System.out.println("-- O Record Store esta fechado");
        } catch (RecordStoreException e) {
            System.out.println("-- Outro erro");
        }
        return toReturn;
    }
    
    //atualiza registro
    public void update(int id, String dado[]) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            for (int i = 0; i < dado.length; i++) {
                dos.writeUTF(dado[i]);
                dos.flush();
            }
            byte[] data = baos.toByteArray();
            getRs().setRecord(id, data, 0, data.length);
        } catch (IOException e) {
            System.out.println("-- Erro de IO");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("-- Registro muito grande");
        } catch (InvalidRecordIDException e) {
            System.out.println("-- ID inexistente");
        } catch (RecordStoreNotOpenException e) {
            System.out.println("-- O Record Store esta fechado");
        } catch (RecordStoreException e) {
            System.out.println("-- Outro erro");
        }
    }
    
    //percorrer lista a procura de um login?
    public void printLoop(int tam) {
        try {
            for (int i = 1; i <= getRs().getNumRecords(); i++) {
                String dados[] = getRecord(i, tam);
                System.out.println("Usuario: ");
                for(int j=0;j<dados.length;j++){
                    System.out.println(dados[j]);
                }
                
            }
        } catch (RecordStoreNotOpenException ex) {
            System.out.println("-- O Record Store esta fechado");
        }
    }

    public RecordStore getRs() {
        return rs;
    }

    public void setRs(RecordStore rs) {
        this.rs = rs;
    }

    /*public void printEnum() {
        try {
            RecordEnumeration re = rs.enumerateRecords(null, null, false);
            while (re.hasNextElement()) {
                System.out.println("-- getRecord = " + getRecord(re.nextRecordId()));
            }
        } catch (InvalidRecordIDException ex) {
            System.out.println("-- ID inexistente");
        } catch (RecordStoreNotOpenException ex) {
            System.out.println("-- O Record Store esta fechado");
        }
    }*/
}
